package com.kk.datastructure.search;

/**
 * title: 插值查找算法
 * 
 * @author 阿K 2020年12月22日 下午10:35:52
 */
public class InsertValuesSearch {

	public static void main(String[] args) {
		int[] arr = new int[100];
		for (int i = 0; i < 100; i++) {
			arr[i] = i + 1;
		}
		int findVal = 87;
		System.out.println(insertValuesSearch(arr, 0, arr.length - 1, findVal));
	}

	/**
	 * 插值查找算法
	 * 
	 * @param arr     原始数组
	 * @param left    左索引
	 * @param right   右索引
	 * @param findVal 查找值
	 * @return
	 */
	public static int insertValuesSearch(int[] arr, int left, int right, int findVal) {

		// 注：在二分查找判断基础上添加 限制，否则 mid 可能越界
		// findVal < arr[0] || findVal > arr[arr.length-1]
		if (left > right || findVal < arr[0] || findVal > arr[arr.length - 1]) {
			return -1;
		}

		// 求出 mid 自适应（思路的公式）
		int mid = left + (findVal - arr[left]) / (arr[right] - arr[left]) * (right - left);
		int midVal = arr[mid];
		if (findVal > midVal) {// 故向右递归
			return insertValuesSearch(arr, mid + 1, right, findVal);
		} else if (findVal < midVal) {// 故向左递归
			return insertValuesSearch(arr, left, mid - 1, findVal);
		} else {
			return mid;
		}
	}

}
